module lpuart_sync(
  // pclk
  input            pclk,
  input            presetn,
  input            uart_clk,
  input            uart_rst_n,

  // pclk -> uart_clk
  input            ue,

  input            stop_1bit,
  input            stop_2bit,
  input            frame_7bit,
  input            frame_8bit,
  input            frame_9bit,
  input            pce,
  input            ps,
  input            msbfirst,

  input            rx_en,
  input            rts_en,
  input            rxfrq,
  input            mmrq,
  input            wake_addrm7,
  input            wake_method,
  input            uesm,

  input            tx_start,
  input            tx_en,
  input    [8:0]   tx_data_reg,
  input            txfrq,
  input            sbkrq,
  input            cts_en,

  input            fifo_en,
  input            rxfnf,

  // uart_clk -> pclk
  input            uart_lp_req,
  input            tx_idle,
  input            tx_finish,
  input            rx_finish,
  input            rx_busy,
  input            rx_pop_ack,
  input    [11:0]  rx_data,
  input            clr_cts,
  input            cts_n,

  // pclk -> uart_clk
  output           sync_ue,

  output           sync_stop_1bit,
  output           sync_stop_2bit,
  output           sync_frame_7bit,
  output           sync_frame_8bit,
  output           sync_frame_9bit,
  output           sync_pce,
  output           sync_ps,
  output           sync_msbfirst,

  output           sync_rx_en,
  output           sync_rts_en,
  output           sync_rxfrq,
  output           sync_mmrq,
  output           sync_wake_addrm7,
  output           sync_wake_method,
  output           sync_uesm,

  output           sync_tx_start,
  output           sync_tx_en,
  output   [8:0]   sync_tx_data_reg,
  output           sync_txfrq,
  output           sync_sbkrq,
  output           sync_cts_en,
  output           sync_clr_cts,

  output           sync_fifo_en,
  output           sync_rxfnf,

  // uart_clk -> pclk
  output           sync_uart_lp_req,
  output           sync_tx_finish,
  output           sync_rx_busy,
  output           sync_rx_finish,
  output    [11:0] sync_rx_data,
  output           sync_cts_n
);

// pclk -> uart_clk

lpuart_basic_2stage_sync#(1) u0_sync_ue
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(ue),
  .data_d(sync_ue)
);

lpuart_basic_2stage_sync#(1) u0_sync_stop_1bit
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(stop_1bit),
  .data_d(sync_stop_1bit)
);
lpuart_basic_2stage_sync#(1) u0_sync_stop_2bit
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(stop_2bit),
  .data_d(sync_stop_2bit)
);
lpuart_basic_2stage_sync#(1) u0_sync_frame_7bit
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(frame_7bit),
  .data_d(sync_frame_7bit)
);
lpuart_basic_2stage_sync#(1) u0_sync_frame_8bit
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(frame_8bit),
  .data_d(sync_frame_8bit)
);
lpuart_basic_2stage_sync#(1) u0_sync_frame_9bit
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(frame_9bit),
  .data_d(sync_frame_9bit)
);
lpuart_basic_2stage_sync#(1) u0_sync_pce
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(pce),
  .data_d(sync_pce)
);
lpuart_basic_2stage_sync#(1) u0_sync_ps
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(ps),
  .data_d(sync_ps)
);
lpuart_basic_2stage_sync#(1) u0_sync_msbfirst
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(msbfirst),
  .data_d(sync_msbfirst)
);

lpuart_basic_2stage_sync#(1) u0_sync_rx_en
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(rx_en),
  .data_d(sync_rx_en)
);
lpuart_basic_2stage_sync#(1) u0_sync_rts_en
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(rts_en),
  .data_d(sync_rts_en)
);
lpuart_basic_2stage_sync#(1) u0_sync_rxfrq
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(rxfrq),
  .data_d(sync_rxfrq)
);
lpuart_basic_2stage_sync#(1) u0_sync_mmrq
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(mmrq),
  .data_d(sync_mmrq)
);
lpuart_basic_2stage_sync#(1) u0_sync_wake_addrm7
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(wake_addrm7),
  .data_d(sync_wake_addrm7)
);
lpuart_basic_2stage_sync#(1) u0_sync_wake_method
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(wake_method),
  .data_d(sync_wake_method)
);
lpuart_basic_2stage_sync#(1) u0_sync_uesm
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(uesm),
  .data_d(sync_uesm)
);

lpuart_basic_2stage_sync#(1) uo_sync_tx_en
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(tx_en),
  .data_d(sync_tx_en)
);
lpuart_basic_2stage_sync#(1) uo_sync_txfrq
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(txfrq),
  .data_d(sync_txfrq)
);
lpuart_basic_2stage_sync#(1) u0_sync_sbkrq
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(sbkrq),
  .data_d(sync_sbkrq)
);
lpuart_basic_mcp_sync #(.DATA_WIDTH(9)) tx_data_mcp_sync
(
  .aready    (),
  .adatain   (tx_data_reg),
  .asend     (tx_start),
  .aclk      (pclk),
  .arst_n    (presetn),

  .bdata     (sync_tx_data_reg),
  .bvalid    (sync_tx_start),
  .bload     (tx_idle),
  .bclk      (uart_clk),
  .brst_n    (uart_rst_n)
);


lpuart_basic_2stage_sync#(1) u0_sync_cts_en
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(cts_en),
  .data_d(sync_cts_en)
);
lpuart_basic_2stage_sync#(1) u0_sync_clr_cts
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(clr_cts),
  .data_d(sync_clr_cts)
);
lpuart_basic_2stage_sync#(1)u0_sync_fifo_en
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(fifo_en),
  .data_d(sync_fifo_en)
);

lpuart_basic_2stage_sync#(1)u0_sync_rxfnf
(
  .clk(uart_clk),
  .rst_n(uart_rst_n),
  .init_d_n(1'b1),
  .data_s(rxfnf),
  .data_d(sync_rxfnf)
);


// uart_clk -> pclk
lpuart_basic_2stage_sync#(1) u0_sync_uart_lp_req
(
  .clk(pclk),
  .rst_n(presetn),
  .init_d_n(1'b1),
  .data_s(uart_lp_req),
  .data_d(sync_uart_lp_req)
);

// lpuart_basic_2stage_sync#(1) u0_sync_tx_finish
// (
//   .clk(pclk),
//   .rst_n(presetn),
//   .init_d_n(1'b1),
//   .data_s(tx_finish),
//   .data_d(sync_tx_finish)
// );
lpuart_basic_mcp_sync #(.DATA_WIDTH(9)) tx_finish_mcp_sync
(
  .aready    (),
  .adatain   (1'b0),
  .asend     (tx_finish),
  .aclk      (uart_clk),
  .arst_n    (uart_rst_n),

  .bdata     (),
  .bvalid    (sync_tx_finish),
  .bload     (1'b1),
  .bclk      (pclk),
  .brst_n    (presetn)
);

lpuart_basic_2stage_sync#(1) u0_sync_rx_busy
(
  .clk(pclk),
  .rst_n(presetn),
  .init_d_n(1'b1),
  .data_s(rx_busy),
  .data_d(sync_rx_busy)
);
lpuart_basic_mcp_sync #(.DATA_WIDTH(9)) rx_data_mcp_sync
(
  .aready    (),
  .adatain   (rx_data),
  .asend     (rx_finish),
  .aclk      (uart_clk),
  .arst_n    (uart_rst_n),

  .bdata     (sync_rx_data),
  .bvalid    (sync_rx_finish),
  .bload     (1'b1),
  .bclk      (pclk),
  .brst_n    (presetn)
);

lpuart_basic_2stage_sync#(1) u0_sync_cts_n
(
  .clk(pclk),
  .rst_n(presetn),
  .init_d_n(1'b1),
  .data_s(cts_n),
  .data_d(sync_cts_n)
);

endmodule
